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