Если вы проверите exe-файлы с помощью ILDASM, то увидите, что в манифесте есть разница (ищите «подсистема»).
В приложении Winforms:
.subsystem 0x0002 // WINDOWS_GUI
В консольном приложении:
.subsystem 0x0003 // WINDOWS_CUI
В коде IL может быть больше различий.
Когда дело доходит до того, что заставляет компилятор по-разному генерировать это в двух случаях, это контролируется значением OutputType файла проекта:
В приложении Winforms:
<OutputType>WinExe</OutputType>
В консольном приложении:
<OutputType>Exe</OutputType>
Из любопытства я также проверил это значение для проекта библиотеки классов:
<OutputType>Library</OutputType>