.ToLookup<TSource, TKey> возвращает ILookup<TKey, TSource>. ILookup<TKey, TSource> также реализует интерфейс IEnumerable<IGrouping<TKey, TSource>>.
.GroupBy<TSource, TKey> возвращает IEnumerable<IGrouping<TKey, TSource>>.
ILookup имеет удобное свойство индексатора, поэтому его можно использовать в стиле, подобном словарю (или похожим на поиск), тогда как GroupBy не может. GroupBy без индексатора - это боль для работы; в значительной степени единственный способ, которым вы можете ссылаться на возвращаемый объект, - это перебирать его (или использовать другой метод расширения LINQ). Другими словами, в любом случае, который работает GroupBy, ToLookup также будет работать.
Все это оставляет мне вопрос, почему я буду беспокоиться о GroupBy? Почему он должен существовать?