How about using LINQ to object?
List<...> initialList = ...;
List<...> listBasedOnPredicateA = initialList.Where(item => predicateA(item)).ToList();
List<...> listBasedOnPredicateB = initialList.Where(item => predicateB(item)).ToList();
...
The predicates are either functions that evaluate some item's properties and return true/false, or you do a direct access to the properties, e.g.
item.PropA == ValueA
, etc.
[EDIT]
Based on the comments below: You might also do the grouping approach:
List<ItemType> initialList = ...;
List<List<ItemType>> listOfList = initialList.GroupBy(item => item.Property)
.Select(group => group.Tolist())
.ToList();
[/EDIT]
Cheers
Andi