Как скомпилировать проект на C# в один .exe файл?
Single File Application - фича современных дотнетов со времён .net Core 3
Буквально при помощи одной опции в файле проекта или одной строкой в консоли собирает ваш проект в единый екзешник, в который ещё может быть опционально встроен рантайм.
Вот пример csproj:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <PropertyGroup>
    <!-- Вот это самое главное -->
    <PublishSingleFile>true</PublishSingleFile>
    <!-- Это чтобы тащить за собой рантайм До .NET 6 будут рядом лежать нативные библиотеки jit-а и сборщика мусора-->
    <SelfContained>true</SelfContained>
    <!-- Это необходимо, чтобы сборщик понимал, для какой ОС нужен экзешник -->
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <!-- Это чтобы ускорить запуск -->
    <PublishReadyToRun>true</PublishReadyToRun>
    <!-- Эти две строки, чтобы уменьшить размер бинарника -->
    <PublishTrimmed>true</PublishTrimmed>
    <TrimMode>link</TrimMode>
  </PropertyGroup>
</Project>
В результате получается единственный exe, который реально можно запустить где угодно, вне зависимости от установленной версии .NET

Для старых версий дотнета есть ILMerge и Costura.Fody, но в .net 5 они не нужны, и я крайне советую использовать именно .NET 5 (а скоро ещё 6 выйдет)
Не использовать References, перенести всё в основной проект