Атрибут DebuggerDisplay не является рекурсивным. {} Внутри строки, по сути, говорит, оцените это выражение и отобразите результат в строке. Строка для внутреннего результата вычисляется так, как если бы в игре не было атрибута DebuggerDisplay для типа или члена. Вот почему вы видите {Foo} вместо --foo--.
Причина этого - надежность. Слишком легко иметь взаимно рекурсивные теги атрибутов DebuggerDisplay. Это может вызвать переполнение стека или бесконечный цикл при оценке внутреннего выражения. Не рекурсивная оценка атрибута DebuggerDisplay предотвращает эту бесконечную рекурсию (хотя для пользователя все еще вполне возможно создать его внутри определенного выражения).
Одним из способов управления отображением внутреннего выражения является переопределение метода .ToString (). Это будет оценено при вычислении отображаемой строки для внутреннего выражения.