Я бы, вероятно, использовал словарь с именем файла в нижнем регистре. Значение будет класс с необходимой дополнительной информацией. Я также искал бы это как ваш пример. Если бы это было медленно, я бы, вероятно, попробовал поискать с помощью linq, чтобы посмотреть, быстрее ли это. Это, однако, одна проблема здесь; для этого необходимо, чтобы все файлы во всех папках имели уникальные имена. Это может иметь место для вас, но это также может быть проблемой, если вы еще не рассмотрели это;)
Помните, что вы также можете использовать объект FileWatcher для синхронизации словаря / списка памяти с содержимым диска, если он может быть изменен. Если он статичен, я, вероятно, сохраню все это в таблице базы данных и выполню поиск, при котором запуск вашей программы будет мгновенным.
Edit:
Только сейчас заметил ваш консерн на дубликаты. Если это проблема, я бы создал List, где fileclass - это класс, содержащий необходимую информацию о файлах. Затем выполните поиск в списке, используя linq, поскольку это может дать вам ноль, один или несколько попаданий. Я думаю, что это было бы более эффективно, чем словарь со списком в качестве значения, где список будет содержать один или несколько элементов (дубликатов).