Thanks, but I'm not having any luck with either solution.

With the easy solution, I tried accessing the grid as the transform's parent...
GameObject new_sp = NGUITools.AddChild (gameObject.transform.parent.gameObject, gameObject);
... but that parents to the Drag and Drop Root, so I guess the reparenting happens before the OnDragDropStart() is called. So I provide the grid reference with a public object and I can add a clone back into the list...
public GameObject grid;
protected override void OnDragDropStart (){
GameObject sp = NGUITools.AddChild (grid, gameObject);
base.OnDragDropStart();
}
...but the grid is rearranged. I can't find a way to insert to new object at the old object's index as if it hasn't moved.
For the trickier method, although I can gain access to the UICamera.currentTouch and can set its objects, this doesn't rest control from the script.
GameObject sp = GameObject.Instantiate (gameObject) as GameObject;
UICamera.MouseOrTouch camtouch = UICamera.currentTouch;
camtouch.dragged = sp;
This leaves the grid untouched and creates a clone at the centre of the screen in the root, but again the dragged object is reparented to the Drag and Drop Root object and the new object isn't in any way attached to the drag activity.