Figured it out.
The UIButtonOffset on hover event is by default, set to 0,0,0, and click is by default set to 2,-2,0, which obviously when touched, hovered, etc, will send the Button back to the root of the grid.
Solution is to parent the button to a game object, and use the parent GameObject in the script, not the button.
So simple rule for anyone reading this, don't instantiate a button into a grid without a parent object.