Это не имеет ничего общего с .NET, стек - это деталь реализации процессора. Практически любой язык программирования должен иметь дело с ним, чтобы получить приемлемую производительность, он часто сильно влияет на дизайн языка.
Самое первое, что поддерживает стек процессора, - это вызов подпрограмм. Инструкция CALL помещает значение указателя инструкции в стек и переходит к фрагменту кода. Это завершается инструкцией RET, он возвращает значение указателя инструкции из стека, и выполнение продолжается там, где оно было прервано, по инструкции после инструкции CALL. Вы узнаете это как метод на языках .NET.
Подпрограмма часто должна работать с переменными, переданными из вызывающего кода. На уровне процессора это работает путем помещения их значения в стек с помощью инструкции PUSH. Затем вызываемая подпрограмма считывает их значение путем индексации стека в известном месте. Вы узнаете это как метод параметр в языках .NET.
Подпрограмме часто требуется память для хранения промежуточных значений. Дешевый способ получить немного - настроить стек, чтобы освободить на нем место. Вы узнаете это как локальные переменные метода .
Как видите, любой вызов метода в .NET занимает некоторое место в стеке. Для хранения обратного адреса, аргументов метода и локальных переменных. Однако это ограниченный ресурс, в 32-разрядной операционной системе стек процессора может возрасти до одного мегабайта. По умолчанию это технически возможно запросить больше места.
Проблема возникает, когда метод вызывает другой метод, который вызывает другой метод, и так далее. Каждый метод занимает место. Это не может продолжаться вечно, в конце концов, процессору не хватает места в стеке. Это Большой Kaboom, StackOverflowException в .NET. По своей сути это ошибка операционной системы низкого уровня. Восстановление из SOE невозможно, основной механизм запуска кода на процессоре неисправен. Вы не можете поймать исключение, ваша программа умирает мгновенной смертью.