If all your user can do is scroll and not really change anything, then there should probably be no need to lock objects if you use synchronous grid.Invoke calls after doing grid.InvokeRequired checks in the places where the grid may be called from another thread.
One way to get a little more through put is to batch the updates on the different thread, and then only try call into the grid every so often with severasl updates instead forcing the grid to respond to every update that comes in.
Here is a little sample.