Источник данных является нулевым, потому что вы никогда не устанавливаете его.
Вы можете просто установить grid.DataSource = this.Records
и полностью пропустить второй цикл foreach.Для этого потребуется также установить DataPropertyName каждого столбца, добавляемого в сетку.
Это может не работать с вашим пользовательским классом NavRecord
без некоторых изменений, хотя (не можетскажем наверняка, если только вы не отправите код для этого).
foreach (NavField field in this.Fields)
{
DataGridViewColumn column = new DataGridViewColumn();
column.HeaderText = field.Caption;
column.Name = field.FieldNo.ToString();
column.ValueType = field.GetFieldType();
column.CellTemplate = new DataGridViewTextBoxCell();
// added:
column.DataPropertyName = field.FieldNo.ToString();
grid.Columns.Add(column);
}
grid.DataSource = this.Records;
О, и вы можете установить grid.AutoGenerateColumns = false;
, иначе каждый столбец может появиться дважды при использовании этого подхода.