There's no pretty way to do this, if the number of rows is variable.
Building heavily on the answer to this question, you need to dynamically build the query before executing it.
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
-- Build a list of ids for each of the selected rows
SELECT @cols = STUFF((SELECT ',[' + convert(varchar,ROW_NUMBER() OVER ( ORDER BY LEFT([vorname],1),LEFT([Name],1) ) ) + ']'
FROM #ADR_Adressen
LEFT JOIN ADR_GruppenLink gl ON gl.AdressNrADR = a.AdressNrADR
WHERE a.Z_Klasse = 'BA' AND gl.GruppeADR != 'KIND'
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
-- Build a query using the list of IDs selected above. These are pivotted into column names
set @query = N'SELECT ' + @cols + N' from
(
select
ROW_NUMBER() OVER ( ORDER BY LEFT([vorname],1),LEFT([Name],1) ) ID,
LEFT(vorname,1) + ''.'' + LEFT(Name,1) Name
from #ADR_Adressen a
LEFT JOIN ADR_GruppenLink gl ON gl.AdressNrADR = a.AdressNrADR
WHERE a.Z_Klasse = 'BA' AND gl.GruppeADR != 'KIND'
) x
pivot
(
max(Name)
for ID in (' + @cols + N')
) p
'
exec sp_executesql @query;
Updated: Given that no ID field is available I've updated this to incorporate the ROW_NUMBER suggestion from Alex below
Query example