Depends on what you intend to do with the data. If the data is going to be read only, you can define a List and set it as the ItemsSource for the datagrid. Then the datagrid will automatically create all the rows to represent items in the list.
If the data is to be manipulated you can use a BindingList<> or an ObservableCollection<>.
How is "creates object for each line" an overkill? You have to represent a line/row of data as an object. That's just common sense, it's not possible to do it any other way.
Basically, if performance is what you are after then the datagrid's ItemsSource has to be as light weight as possible. A DataTable might be an overkill, if you don't intend to use all of it's features. A List<> on the other hand is as light weight as possible.
Also note that the WPF datagrid by default uses virtualization, which helps performance as well. There are some caveats thow, like don't put the datagrid inside a stackpanel otherwise the virtualization effect goes away - you can google about this.
One final thing, by my experience the .NET4 WPF builtin datagrid has a serious design bug. Basically each DataGridRow consumes 1MB of memory even for the simplest of data. With virtualization and only showing 30 rows, it's not a huge deal braker - only 30MB of memory consumed. But take a thousand rows, turn off virtualization and the memory consumption is 3GB!!!! On contrast, a WinForm datagridview, consumes more than 10x less memory with the same data. Even with virtualization disabled a thousand rows only takes 30MB...
I've opened a bug about this in Connect, but the specialized experts have yet to look into this issue. Not sure if the WPF toolkit datagrid behaves any better...