Похоже на работу для настраиваемой наблюдаемой коллекции, которая реализует IEnumerable и имеет довольно маленький перечислитель (ааа, yield), который обрабатывает логику настраиваемой сортировки.
public class SortFoosLolThx : ObservableCollection<Foo> {
public IList<string> SortList {/*...*/}
/*...*/
public override IEnumerator<Foo> GetEnumerator() { /*...*/ yield foo; /*...*/}
}