El atributo DebuggerDisplay no es recursivo. El {} dentro de la cadena básicamente dice evaluar esta expresión y mostrar el resultado en línea. La cadena para el resultado interno se calcula como si no hubiera un atributo DebuggerDisplay en juego para tipo o miembro. Es por eso que ves {Foo} en lugar de --foo--.
El motivo es la fiabilidad. Es demasiado fácil tener etiquetas de atributos DebuggerDisplay mutuamente recursivas. Esto causaría un desbordamiento de pila o un bucle infinito al evaluar una expresión interna. La evaluación no recursiva del atributo DebuggerDisplay evita esta recursión infinita (aunque todavía es bastante posible que el usuario la cree ellos mismos dentro de una expresión particular).
Una forma de controlar la forma en que se muestra la expresión interna es anulando el método .ToString(). Esto se evaluará al calcular la cadena de visualización para una expresión interna.
Gracias! Entonces, no tiene nada que ver con ser genérico. Iré por la solución ToString. –