+1  A: 

To work with DataGridView, you need to implement the non-generic IList, not the generic IList<T> (or simpler and better: inherit from BindingList<T>, which provides things like change notifications via INotifyPropertyChanged). For working with LINQ-to-SQL I have some info on usenet that might be useful (assuming it still holds water - it has been a while).

re "rest of the problem"... can you be more specific?

Re filtering LINQ-to-SQL efficiently, you don't want to use Predicate<T>; you want to use Expression<Func<T,bool>>; this allows you to pass this down to the database via Queryable.Where, i.e. (where you have an IQueryable<T> source) something like:

IQueryable<T> data = tableSource;
// then for each filter "expr"
{
  data = data.Where(expr);
}

Writing a true filtered list is very tricky. I've done it for in-memory objects (I can't post the code, though) - but it takes a lot of object tracking etc. Unless you absolutely need this, it may be easier to keep things simple and just display simple snapsnots, tracking just additions/removals. For simple snapshots, just ToBindingList() may suffice...

Marc Gravell
Thanks, I'll rewrite my FilteredList class using that. Any ideas about the rest of the problem? So, how would you filter? And what is that IndexOutOfRangeException?
ShdNx
Will update answer...
Marc Gravell
I see... so I should forget filtering the fetched data and should re-query the database when a filter is set. Using Expression<Func<T, bool>> is a good idea, thank you! I'll wait a bit and see whether someone else has got another option... if not, then I'll accept your answer. Anyway, thank you for your time and help!
ShdNx
Implementing the IList non-generic interface allowed me to bind the FilteredList object as a DataSource, but didn't solve the IndexOutOfRange problem...
ShdNx
A: 

So, I tried to follow what Marc Gravell advised, and implemented the System.Collections.IList interface instead of the generic one. It worked, so I could bind it to the DataSource property of the DataGridView, and it displayed all rows, but as I added a filter and began to scroll down (for some reason, the list isn't refreshed until I start to scroll - Invalidate(), Refresh() and Update() doesn't help it) it started to give those weird IndexOutOfRangeException-s as DataError-s.

Any ideas how to do this stuff? I can't believe that linq to sql with datagridview sucks so hard (sorry, but this is getting ridicolous)...

ShdNx