Freepascal при использовании $codepage или BOM переводит в исходнике все строковые константы в unicodestring с кодировкой UCS2.
Выполнение Caption:='Привет' прозрачно преобразовывает 'Привет' из unicodestring в TCaption. Преобразование пропускается сквозь менеджер широких строк, который unicodestring переводит в TCaption (а это обычный string) в системной кодировке. Под виндой системная кодировка - CP1251. В результате в Caption будет 'Привет' в CP1251, в то время как лазарус ожидает все строковые параметры в UTF-8, со всеми отсюда вытекающими.
Варианты решения:
1) не использовать $codepage или BOM
2) не использовать строковых констант, widestring, unicodestring ни в каком виде
3) не использовать винду
