You can also use a cross-tab approach:
;WITH cte_data AS (
SELECT *, ROW_NUMBER() OVER(PARTITION BY Company, worklocation ORDER BY Category) AS row_num
FROM #TableData
)
SELECT Company, worklocation,
MAX(CASE WHEN row_num = 1 THEN Category ELSE '' END) AS [Category 1],
MAX(CASE WHEN row_num = 1 THEN Setup ELSE '' END) AS [Setup 1],
MAX(CASE WHEN row_num = 1 THEN Processing ELSE '' END) AS [Processing 1],
MAX(CASE WHEN row_num = 2 THEN Category ELSE '' END) AS [Category 2],
MAX(CASE WHEN row_num = 2 THEN Setup ELSE '' END) AS [Setup 2],
MAX(CASE WHEN row_num = 2 THEN Processing ELSE '' END) AS [Processing 2],
MAX(CASE WHEN row_num = 3 THEN Category ELSE '' END) AS [Category 3],
MAX(CASE WHEN row_num = 3 THEN Setup ELSE '' END) AS [Setup 3],
MAX(CASE WHEN row_num = 3 THEN Processing ELSE '' END) AS [Processing 3]
/*, ...*/
FROM cte_data
GROUP BY Company, worklocation