Нет, это не работает. Параметрические типы универсальной коллекции (или другой универсальной) в C # должны быть декларируемыми типами, а атрибуты существуют только как метаданные.
У вас не может быть объекта типа FooAssignable. У вас может быть объект, имеющий атрибут FooAssignable, но это не то же самое, что иметь его как супертип. FooAssignable не является классом или интерфейсом и не является допустимым спецификатором типа. FooAssignableAttribute есть, но это тип, который ссылается на сам атрибут, а не на элементы, помеченные этим атрибутом.
Учтите, что в словаре тип выхода для индексатора - это тип выхода, который вы указали. Но у вас не может быть переменной типа FooAssignable - у вас может быть переменная типа, которая была помечена с помощью FooAssignable, но нет единого базового класса, который подходит всем этим типам. Поскольку это объявление типа недопустимо, этот Словарь будет иметь недопустимый несуществующий тип в качестве типа возврата для метода получения из его индексатора, среди многих других мест. Проверка типа C # не может быть спонтанно заменена с помощью общих механизмов с проверкой наличия атрибута.
Все, что вы хотите, чтобы система типов проверила для вас, должно быть частью системы типов. Оценка атрибута не определяет типы, поэтому система типов не может сделать это за вас; Между тем, дженерики являются частью языка, который наиболее непосредственно взаимодействует с системой типов. Вам нужно будет на самом деле пройти систему типов, чтобы выполнить такую проверку, а это означает, что вместо этого следует добавить FooAssignableAttribute в интерфейс (IFooAssignable?).