You can build projects programmatically using the MSBuild API and have SonarQube analysis performed as part of the build. The SonarQube Scanner for MSBuild is not tightly coupled to the MSBuild.exe command line.
ImportBefore functionality is implemented in the standard Microsoft targets files. For example, have a look at %ProgramFiles(x86)%\MSBuild\14.0\Bin\Microsoft.Common.CurrentVersion.targets which contains the following line:
<Import Project="$(MSBuildUserExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.targets\ImportBefore\*" Condition="'$(ImportUserLocationsByWildcardBeforeMicrosoftCommonTargets)' == 'true' and exists('$(MSBuildUserExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.targets\ImportBefore')"/>
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.targets\ImportBefore\*" Condition="'$(ImportByWildcardBeforeMicrosoftCommonTargets)' == 'true' and exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.targets\ImportBefore')"/>
All these lines do is import any target files that exist in well-known locations. This mechanism can be used to automatically include targets into every project, without having to explicitly include the targets file in the project. This mechanism is independent of MSBuild.exe. However, it does matter which version of standard targets files you are using: the v4.0 standard target files don't include this mechanism, but the v12.0 and v14.0 versions do.
The simplest way to trigger a build programmatically is to use MSBuild v12.0 or v14.0 and rely on the standard ImportBefore behaviour.
Alternatively, you could do one of the following:
manually edit your project files to explicitly include the required SonarQube targets, or
programmatically import the required SonarQube targets using the MSBuild API before triggering the build (by adding an "Item" of type "Import" with the include parameter pointing to the location of the targets file to import). The SonarQube Scanner for MSBuild integration tests use this approach.