Podrías Hacerlo con una Hebra...
Creas un método que será el encargado de ocultar los controles, mostrar la imagen de "Cargando", cargar los datos en el DataGrid, y una vez que acabe de cargar, ocultar la imagen y mostrar los controles
Código:
public void LoadData()
{
this.Invoke((MethodInvoker)delegate
{
//Muestras un control ProgresBar (Por ejemplo)
// Estableces la propiedad Enabled a False en los controles que no quieras.
});
//Cargas los datos en el Datagrid
this.Invoke((MethodInvoker)delegate
{
//Harías lo contrario al primer bloque, por que los datos ya estarían cargados.
});
}
En el Evento Click del botón:
Código:
new System.Threading.Thread(new System.Threading.ThreadStart(LoadData)).Start();