Вы правы, программа должна быть скомпилирована для каждой конкретной архитектуры и операционной системы. Скомпилированные программы не переносимы между архитектурами или ОС.
К счастью, почти каждый компьютер имеет 32-битную архитектуру x86 или 64-битную архитектуру x86_64 (которая совместима с x86). Кроме того, все версии Windows после и включая XP в основном совместимы, так как все они основаны на одном ядре. Это позволяет скомпилированному для x86_64 и Windws запускаться на любой машине с 64-битными окнами, а программу, скомпилированную для x86-окон, можно запускать практически на любой машине с Windows. Это, конечно, при условии, что все надлежащие dll на месте.
То же самое верно для Linux, так как все версии Linux должны быть совместимы.
При установке игры обычно просто копируются игровые файлы и библиотеки в определенный каталог. Иногда он устанавливает некоторые переменные, необходимые для запуска игры. Программа установки практически никогда не компилирует исходный код перед установкой, хотя некоторые программы (обычно для Linux) распространяются так, что пользователь должен сам скомпилировать их перед установкой.