Нельзя сказать, что кроссплатформенная программа адаптируется к той или иной ОС.
Грубо говоря, на этапе написания ПО программист задает поведение в зависимости от ОС, в которой исполняется программа.
Если это ОС одного семейства (например, Windows), то в коде могут указываться проверки на версию ОС, и в зависимости от этого включаются\отключаются те или иные фичи.
Если ПО пишется под разные ОС (например, Windows и GNU/Linux), то код программ может значительно отличаться (зависит от того, используются ли какие-то особенности работы ОС для работы программы, задействованы какие-либо библиотеки). В таком случае код программы также комплилируется различными версиями компилятора, генерирующими исполняемый код для своей платформы.
Есть ещё один тип кроссплатформенного ПО, выполняемый на виртуальной машине (например, написанный на языке Java). В таком случае, для каждой поддерживаемой ОС уже есть своя среда исполнения, представляющая собой виртуальную машину. Программа пишется для исполнения в этой виртуальной машине (одинаковой для всех платформ), а уже сама среда исполнения этих виртуальных машин разрабатывается отдельно под каждую поддерживаемую ОС.