Для начала это был не их выбор. Это решение было принято задолго до того, как они начали работу, а культура - свойство потока операционной системы. Просмотрите документы SDK для функций API Get/SetThreadLocale(), например.
Это не полностью объясняет это, они виртуализировали другие функции ОС, хотя этот очень трудно виртуализировать, потому что так много API-интерфейсов чувствительны к культуре, особенно COM-версии.
Следующая веская причина заключается в том, что изменить культуру в масштабе всего процесса так сложно реализовать. Это состояние неразрешимой гонки. Некоторая другая нить может быть в центре форматирования данных, имеющих культурную близость. Хотя блокировка будет работать, чтобы предотвратить использование свойств культуры так же, как она меняется, она может не предотвратить ее изменение в середине цепочки форматирования вызовов. Это потребовало бы, чтобы они взяли какой-то глобальный замок и удерживали его на время работы по форматированию. Тупик очень наверняка.
Есть еще один аспект этого, тот, который я считаю реальной проблемой. Это связано с свойством Thread.ExecutionContext. Структура использует это для «потока» состояния потока из одного потока в другой. Очень неясный, но важный, чтобы наполнить такие вещи, как контекст безопасности, на рабочий поток. Было бы идеально, если бы этот контекст мог также наполнить культуру, чтобы вы могли быть уверены, что любой из рабочих, которых вы начинаете, имеет ту же культуру, которую вы выбрали, а не по умолчанию для операционной системы.
Это не так, я действительно не знаю, почему. Наверное, потому что первая причина, которую я дал. То, что делает, тем не менее, очень опасно менять культуру нити. Ошибки, которые могут вызывать, - очень тонкие. Подобно созданию SortedDictionary со строкой в качестве ключевого элемента основного потока с нестандартной культурой по умолчанию. Затем выяснение, что рабочий поток не может время от времени находить материал назад, потому что правила сортировки строк различны.
EDIT: есть некоторое облегчение от этой проблемы в .NET 4.5, он поддерживает новый статический CultureInfo.DefaultThreadCurrentCulture и свойства DefaultThreadCurrentUICulture.
EDIT2: культура теперь протекает, как описано в четвертом абзаце в .NET 4.6. Это должно облегчить все проблемы.