Typically, developers hide a DataGrid column by getting the index of the column to be hidden, and then hiding it in the ItemCreated event as follows:
e.Item.Cells[myColumnIndex].Visible = false;
That works, but it forces the runtime to first create the cells and then hide them. A better approach is to not create them at all.
To avoid the unneeded column creation, bind each column that needs to be visible to the DataGrid manually (instead of auto-generating the columns). Add each column as a bound column and set its DataField property.