Alright, it's not the prettiest thing in the world, but since you've already committed to using dynamic SQL, this should get the job done. I tried to run just the initial pivot, but I couldn't get the results to roll up. They ended up looking like this:

Close, but not exactly what you are after. So here is the what I came up with to extend on this. There may be (and I hope there is) a cleaner way to do this, but here goes nothing:
--DEMO SETUP
DROP TABLE IF EXISTS #ticketbaylist
CREATE TABLE #ticketbaylist
(
ID INT IDENTITY (1,1) NOT NULL
,Tile NVARCHAR(250)
,BayName NVARCHAR(20)
,LocationID INT
)
INSERT INTO #ticketbaylist
VALUES
('Ticket 1: test 1', 'Bay 02', 1)
,('Ticket 2: test 2', 'Bay 02', 2)
,('Ticket 3: test 3', 'Bay 02', 3)
,('Ticket 4: test 4', 'Bay 01', 2)
,('Ticket 5: test 5', 'Bay 01', 2)
,('Ticket 6: test 6', 'Bay 02', 1)
,('Ticket 7: test 7', 'Bay 05', 1)
,('Ticket 8: test 8', 'Bay 09', 1)
,('Ticket 9: test 9', 'Bay 09', 1)
,('Ticket 10: test 10', 'Bay 05', 1)
,('Ticket 11: test 11', 'Bay 05', 1)
,('Ticket 12: test 12', 'Bay 04', 1)
,('Ticket 13: test 13', 'Bay 09', 1)
,('Ticket 14: test 14', 'Bay 03', 1)
,('Ticket 15: test 15', 'Bay 03', 1)
--END DEMO SETUP
DECLARE @Columns NVARCHAR(MAX)
SELECT @Columns = COALESCE(@Columns + ', ','') + QUOTENAME(BayName) FROM (SELECT Distinct BayName
FROM #ticketbaylist) as a ORDER BY BayName
DECLARE @LocationID INT = 1
DECLARE @ticketEntries NVARCHAR(MAX) = N''
DECLARE @locationBays NVARCHAR(MAX) = N''
DECLARE @locationBaysUpdate NVARCHAR(MAX) = N''
DECLARE @lbColumnDefs NVARCHAR(MAX) = N''
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @locationBays += ',' + QUOTENAME(BayName) FROM #ticketbaylist GROUP BY BayName
SELECT @locationBaysUpdate += ',' + QUOTENAME(BayName) + ' = b.' + QUOTENAME(BayName) FROM #ticketbaylist GROUP BY BayName
SELECT @lbColumnDefs += ',' + QUOTENAME(BayName) + ' NVARCHAR(MAX)' FROM #ticketbaylist GROUP BY BAYNAME
SELECT @sql = 'DECLARE @outputTable TABLE
(
TicketEntry INT'
+ @lbColumnDefs
+ ')
;WITH pvtSetup
AS
(
SELECT *
,ROW_NUMBER() OVER (PARTITION BY LocationID, BayName ORDER BY ID) as BayEntry
FROM #ticketbaylist
)
SELECT
BayEntry,' + @Columns
+ ' into #pvt
FROM pvtSetup
PIVOT (
MIN(tile)
FOR BayName IN (' + @Columns + ')
) as pvt
INSERT INTO @outputTable (TicketEntry) SELECT DISTINCT BayEntry FROM #pvt
UPDATE @outputTable
SET ' + STUFF(@locationBaysUpdate, 1,1,'') +
' FROM @outputTable a
inner join #pvt b on a.TicketEntry = b.BayEntry
SELECT ' + STUFF(@locationBays, 1,1,'') + ' FROM @outputTable'
PRINT @sql
EXEC (@sql)
And here is what that query produces:
