Вы, похоже, думаете о GetHashCode как об уникальном ключе.Это не так.Хэш-коды являются 32-разрядными целыми числами и не предназначены для того, чтобы быть уникальными, они только хорошо распределены по 32-разрядному пространству, чтобы минимизировать вероятность конфликта.Попробуйте это для вашего метода GetHashCode ColumnDataKey:
ColumnID * 397 ^ (SubGroupID.HasValue ?? SubGroupID.Value : -11111111)
Магические числа здесь 397, простое число, которое по причинам магии вуду является хорошим числом, на которое нужно умножить, чтобы смешать ваши битыномер, выбранный командой ReSharper), и -11111111, идентификатор подгруппы, который, как я полагаю, на практике вряд ли возникнет.