Você está certo, um programa deve ser compilado para cada arquitetura e sistema operacional específicos. Programas compilados não são portáveis entre arquiteturas ou sistemas operacionais.
Felizmente, quase todo computador é uma arquitetura x86 de 32 bits ou uma arquitetura x86_64 de 64 bits (compatível com x86). Além disso, todas as versões do Windows após e incluindo o XP são na sua maioria compatíveis, uma vez que todas são baseadas no mesmo kernel. Isso permite que um compilado para x86_64 e Windws seja executado em qualquer máquina Windows de 64 bits e um programa compilado para janelas x86 para rodar basicamente em qualquer máquina Windows. Isso está assumindo que todas as DLLs apropriadas estão em vigor, é claro.
O mesmo vale para o Linux, já que todas as versões do Linux devem ser compatíveis.
Instalar um jogo geralmente copia os arquivos e bibliotecas do jogo para um diretório específico. Às vezes, ele define algumas variáveis necessárias para o jogo ser executado também. O instalador praticamente nunca compila a fonte em tempo real antes de instalar, embora alguns programas (geralmente para Linux) sejam distribuídos como uma fonte que o usuário deve compilar antes de instalar.