A couple of points. If you want the grid to store the header values for you, then you need to allocate some internal storage for this. Or, you could provide this header cell value in QueryCellInfo and save it in SaveCellInfo through some data item that you control. To use the grid's internal storage, you would need to set the column count on the grid's Data object.
public Form1()
{
InitializeComponent();
this.gridControl1.Model.Data.ColCount = 100; //could use only 17 if that is last column hedaer you want to populate
gridControl1.ResetVolatileData();
}
Then in QueryCellInfo, you should not set e.Handled = true for this cell as you want to retrieve the saved value. Attached is a file with these changes that seems to work for me.