I figured out some more.
If I turn off "Smooth Tween" on the UIGrid it works perfectly.
So this is my theory:
I remove the first element in the grid, then Reposition() is called, but it hasn't tweened yet. Then ResetPosition() is called and it changes the position based on the actual items, not the size of the grid. Then after it does that, the tween ends and shoves all the items up one position so the first element is now above the clip.
That may not be what's happening, just my theory. How do I solve it? I can wait until the tween ends and then call ResetPosition(), but then I'm waiting for this nice smooth animation to go off and then jerking it into place.