Почему необходимо приводить те или иные множества к IEnumerable? И Как использовать IReadOnlyCollection?
Да просто пытаются защитить коллекцию от модификации. Когда ты на выходе получишь IEnumerable, то ты не изменить, не добавить элементы не можешь. Да и в большинстве случаев ты потом результат всё равно как последовательность обрабатываешь.
Принимай наиболее общие типы, отдавай наиболее специфичные. 
На вход:
1) Если надо только перебрать элементы один раз то IEnumerable
2) Если нужен Count то IReadOnlyCollection
3) Если нужен индекс то IReadOnlyList
4) Если нужна запись, то ICollection или IList
На выход:
Наиболее специфичный тип. List<>, ReadOnlyCollection<>