Один файл = Один класс или Struct. Иногда (очень редко) делаю исключения для нескольких Enum, но в последнее время стараюсь так не делать.
Если мне необходимо логически объединить несколько сущностей в одну кучу — создаю папку в проекте, и кидаю эти сущности в папку. Само собой namespace соответствует относительному пути.
У нас в компании тоже случаются очень горячие споры по этому поводу, поэтому точно могу сказать, что рекомендации рекомендациями, но все люди разные.
Из аргументов в защиту своего правила могу привести очень свежий пример. Сейчас разбираюсь с проектом, в который вошел только на этапе разработки второй версии и в этом проекте существовали файлы с 10+ классами внутри. Причем сами файлы иногда носили имя, которое не дает возможности однозначно понять что же находится в этом файле. Было очень трудно разобраться с архитектурой до того момента, пока постепенно не привел все к нормальной структуре с подпапками. Без этого проект полон сюрпризов — перемещаешься по нему как наощупь, не имея куда попал после очередного перехода к классу и почему.