Even then, "Just add it as a prefab," is proving non-trivial.
I take my sprite that's presently in the grid and drag it to the assets to create a prefab. I then have to instantiate that and add it to the grid. So I try adding a UISprite, and I try referencing the UIGrid as a GameObject, and various things until I stumble upon accessing the sprite as a GameObject and not a Sprite.
And then a bit of trial and error later, I get:
GameObject sp;
sp = NGUITools.AddChild(gameObject, Instantiate (prefab) as GameObject);
sp.GetComponent<UISprite>().name = "Sprite 1";
sp.GetComponent<UISprite>().spriteName = "Emoticon - Angry";
...which adds the new item to the list and changes it to the desired icon, only it also adds a second item in the middle of the screen. And lots of trial and error later with various combinations of instantiates and assignings, that's still the case - I cannot get a prefab into the grid without also getting a second listItem(clone) to appear. So what's trivial and doesn't need explaining to you is not necessarily piddly easy and obvious to some of us thickos.

Edit: Persisting with this, I've found the solution. The AddChild function instantiates the object (as the documentation states), but wasn't apparent in your reply and didn't sink in on first investigation. But an hour of my time would have been saved if there was a simple tutorial, even just a tiny piece of reference code like:
public class AddItemsToGrid : MonoBehaviour {
// Script to add items to a grid. Attach this script to your grid
public GameObject prefab; // prefab of sprite to clone
void Start () {
GameObject sp; // handle for cloned sprite
sp = NGUITools.AddChild(gameObject, prefab); // clone sprite, add as child to grid object
sp.GetComponent<UISprite>().name = "Sprite 1"; // use sp handle to modify properties such as name...
sp.GetComponent<UISprite>().spriteName = "Emoticon - Angry"; //.....and sprite graphic
}
}