Microsoft recommends that when using SqlBulkCopy, the source and target column types match. And according to the internet, SqlBulkCopy isn't as forgiving about mismatched types as INSERT .. SELECT. So I'd say converting in the query is a good idea.
Not to mention that type conversions aren't always straightforward or consistent. For example, which number conversions round and which ones truncate, and are all the conversion rules the same within SQL Server (which is where the CONVERTs are performed, or where conversions would happen if this were INSERT .. SELECT) as they are for SqlBulkCopy (which isn't the same as INSERT .. SELECT)? If you don't know exactly what the rules are, it's wise to be cautious.
Additionally, if the type conversion fails within the query, you may get a more useful error message than if the bulk insert fails. If you want these queries to be more manageable, you could write them like this:
SELECT TOP (0)
CAST('' AS NVARCHAR(50)) AS Address1,
CAST(0 AS SMALLINT) AS LanguageID
UNION ALL
SELECT
t.Address1,
CASE t.language_cd
WHEN 'E' THEN 31
WHEN 'N' THEN 32
WHEN 'D' THEN 38
ELSE 39 END AS LanguageID
FROM MyTable t
There's a good chance this rewriting would have no effect on query optimization (if that's an issue, check), and while TOP isn't standard SQL, the code was T-SQL-specific from the CONVERT instead of CAST, so it wasn't standard to begin with.
The advantage here is that the guts of the query isn't cluttered, and the part of the query that announces and enforces the target table column types is completely separate, making it easy to change if a column type is modified.