Team City, вероятно, все еще передает параметр в командной строке, просто с пустым значением, как, например,
/p:Version=""
или что-то подобное. Симптом, который вы видите, связан с тем, как MSBuild работает с переопределенными свойствами. При указании в командной строке свойство будет принимать это значение независимо от того, объявлено оно или нет в статическом (глобальном в файле, а не в целевом) объявлении PropertyGroup. Таким образом, ваше объявление Version с проверкой условия на пустую строку полностью пропускается.
Одним из способов решения этой проблемы является перемещение вашей PropertyGroup, содержащей объявление $ (Version), с его Условием, в цель, где она впервые используется. MSBuild позволит перезаписать значение свойства командной строки из «динамического» свойства, созданного во время выполнения из целевого объекта.
Если вы запустите эту командную строку ...
> msbuild My.proj /t:Ver /p:Version=""
... и иметь эту цель ...
<Target Name="Ver">
<PropertyGroup>
<Version Condition="'$(Version)' == ''">1.2.3.4<Version>
</PropertyGroup>
<Message Text="Version: '$(Version)'" />
</Target>
... вы получите версию, показывающую 1.2.3.4, тогда как с помощью PropertyGroup за пределами цели она сохранит пустое значение.