Если вы используете .NET 3.5, попробуйте следующее:
List<string> categories = collection
.Cast<Foo>()
.Select(foo => foo.Category)
.Distinct()
.ToList();
Это должно быть очень быстро.
Я предполагаю, что эти объекты изначально пришли из базы данных? Если это так, то вы можете попросить базу данных сделать работу за вас. Если в этом столбце есть индекс, вы получите результат, близкий к мгновенному, даже не загружая объекты в память.