As Michael says, you can certainly implement an IDataReader which is the most efficient way of doing it but there is some extra work required. Implementing GetSchemaTable is kind of a pain to implement but it's not that bad if you use the code below as a starting point.
var table = new DataTable( "SchemaTable" );
table.Locale = CultureInfo.InvariantCulture;
table.Columns.Add( new DataColumn( SchemaTableColumn.ColumnName, typeof( string ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.ColumnOrdinal, typeof( int ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.ColumnSize, typeof( int ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.NumericPrecision, typeof( short ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.NumericScale, typeof( short ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.DataType, typeof( Type ) ) );
table.Columns.Add( new DataColumn( SchemaTableOptionalColumn.ProviderSpecificDataType, typeof( Type ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.NonVersionedProviderType, typeof( int ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.ProviderType, typeof( int ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.IsLong, typeof( bool ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.AllowDBNull, typeof( bool ) ) );
table.Columns.Add( new DataColumn( SchemaTableOptionalColumn.IsReadOnly, typeof( bool ) ) );
table.Columns.Add( new DataColumn( SchemaTableOptionalColumn.IsRowVersion, typeof( bool ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.IsUnique, typeof( bool ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.IsKey, typeof( bool ) ) );
table.Columns.Add( new DataColumn( SchemaTableOptionalColumn.IsAutoIncrement, typeof( bool ) ) );
table.Columns.Add( new DataColumn( SchemaTableOptionalColumn.IsHidden, typeof( bool ) ) );
table.Columns.Add( new DataColumn( SchemaTableOptionalColumn.BaseCatalogName, typeof( string ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.BaseSchemaName, typeof( string ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.BaseTableName, typeof( string ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.BaseColumnName, typeof( string ) ) );
table.Columns.Add( new DataColumn( SchemaTableOptionalColumn.BaseServerName, typeof( string ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.IsAliased, typeof( bool ) ) );
table.Columns.Add( new DataColumn( SchemaTableColumn.IsExpression, typeof( bool ) ) );