To display a List<ExpandoObject>, creating columns automatically based on data, add a DataGridView to your form, do not set any property yet, and execute the next code:
// Sample list
List<ExpandoObject> list = new List<ExpandoObject>( );
dynamic obj0 = new ExpandoObject( );
obj0.Name = "John";
obj0.Age = 120;
list.Add( obj0 );
dynamic obj1 = new ExpandoObject( );
obj1.Name = "Sarah";
obj1.Age = 117;
list.Add( obj1 );
dataGridView1.AutoGenerateColumns = true;
var dt = new DataTable( );
ExpandoObject first = list.First( );
var first_d = (IDictionary<string, object>)first;
foreach( var key in first_d.Keys )
{
var val = list.Select( o => ( (IDictionary<string, object>)o )[key] ).FirstOrDefault( v => v != null );
dt.Columns.Add( key, val?.GetType( ) ?? typeof( object ) );
}
foreach( var obj in list )
{
dt.Rows.Add( dt.Columns.Cast<DataColumn>( ).Select( c => ( (IDictionary<string, object>)obj )[c.ColumnName] ).ToArray( ) );
}
dataGridView1.DataSource = dt;
The example uses a list with some sample data. If it works, then try your real list.