Вы не должны зацикливаться на всех элементах источника данных, вы зацикливаетесь вертикально на всех записях, в то время как вы хотите зациклить только один раз, горизонтально, на всех столбцах. Поскольку вы знаете список свойств объекта, содержащийся в источнике данных, вы можете делать это статически, и даже не в foreach. Если вы действительно хотите, чтобы он был динамическим, то вы можете использовать Reflection и цикл во всех открытых полях первого объекта, доступного в вашем IEnumerable.
Редактировать: чтобы найти все открытые поля объекта с помощью отражения, см. Здесь:
Как найти все открытые поля объекта в C #?
но это применимо только в том случае, если вы хотите сделать его универсальным, если вы уже знаете, что ваш объект содержит некоторые поля, например, Имя, Адрес и Электронная почта, например, вам это не нужно.