The tricky thing is getting the custom column names. I find it's usually easier to rename temp table columns than to try to generate columns with dynamic names, because that forces the SQL itself to be dynamic which makes it much more difficult and time consuming to modify the code later.
If you'll provide some directly usable sample data, I can verify the code and adjust it if needed:
DECLARE @DateAddedEnd date
DECLARE @DateAddedStart date
SET @DateAddedStart = '20190101'
SET @DateAddedEnd = '20211231'
SELECT
ClientID,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) = 0 THEN UserID END) AS Q1,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) = 1 THEN UserID END) AS Q2,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) = 2 THEN UserID END) AS Q3,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) = 3 THEN UserID END) AS Q4,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) = 4 THEN UserID END) AS Q5,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) = 5 THEN UserID END) AS Q6,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) = 6 THEN UserID END) AS Q7,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) = 7 THEN UserID END) AS Q8,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) = 8 THEN UserID END) AS Q9,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) = 9 THEN UserID END) AS Q10,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) =10 THEN UserID END) AS Q11,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) =11 THEN UserID END) AS Q12,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) =12 THEN UserID END) AS Q13,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) =13 THEN UserID END) AS Q14,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) =14 THEN UserID END) AS Q15,
COUNT(DISTINCT CASE WHEN DATEDIFF(QUARTER, @DateAddedStart, DateAdded) =15 THEN UserID END) AS Q16
INTO #qtr_totals
FROM dbo.your_table_name
WHERE
DateAdded >= @DateAddedStart AND
DateAdded < DATEADD(DAY, 1, @DateAddedEnd)
GROUP BY
ClientID
DECLARE @ColumnCounter tinyint
DECLARE @ColumnCounterMax tinyint
DECLARE @ColumnNameNew varchar(50)
DECLARE @ColumnNameOld varchar(50)
SET @ColumnCounter = 1
SET @ColumnCounterMax = DATEDIFF(QUARTER, @DateAddedStart, @DateAddedEnd) + 1
WHILE @ColumnCounter <= @ColumnCounterMax
BEGIN
SET @ColumnNameOld = 'tempdb.dbo.#qtr_totals.Q' + CAST(@ColumnCounter AS varchar(3))
SET @ColumnNameNew = 'Q' + CAST(DATEPART(QUARTER, @DateAddedStart + @ColumnCounter - 1) AS varchar(1)) +
' ' + CAST(YEAR(@DateAddedStart + @ColumnCounter - 1) AS varchar(4))
EXEC sys.sp_rename @ColumnNameOld, @ColumnNameNew, 'COLUMN'
END /*IF*/
SELECT *
FROM #qtr_totals
ORDER BY ClientID