I used the following, which gets you part of the way there.
USE tempdb;
GO
CREATE TABLE Test
(
uname VARCHAR(255)
, num INT
);
INSERT INTO Test (uname, num) VALUES ('Max', 1);
INSERT INTO Test (uname, num) VALUES ('Max', 2);
INSERT INTO Test (uname, num) VALUES ('Max', 3);
INSERT INTO Test (uname, num) VALUES ('Max', 4);
INSERT INTO Test (uname, num) VALUES ('Max', 5);
INSERT INTO Test (uname, num) VALUES ('Max', 11);
INSERT INTO Test (uname, num) VALUES ('Max', 12);
INSERT INTO Test (uname, num) VALUES ('Max', 13);
INSERT INTO Test (uname, num) VALUES ('Max', 14);
INSERT INTO Test (uname, num) VALUES ('Max', 15);
INSERT INTO Test (uname, num) VALUES ('Jen', 22);
INSERT INTO Test (uname, num) VALUES ('Jen', 23);
INSERT INTO Test (uname, num) VALUES ('Jen', 24);
INSERT INTO Test (uname, num) VALUES ('Jen', 25);
SELECT uname
, CAST(min(num) as varchar(255)) + ' - ' + CAST(max(num) as varchar(255)) AS NumRange
FROM (
SELECT uname, num - ROW_NUMBER() OVER (PARTITION BY uname ORDER BY num) groupnum, num
FROM dbo.Test
) t
GROUP BY uname, groupnum;
Results:

Here is the sample code provided so kindly by @AaronBertrand
;WITH cte as (
SELECT uname
, min(num) As MinNum
, CAST(min(num) as varchar(255)) + ' - ' + CAST(max(num) as varchar(255)) AS NumRange
FROM (
SELECT uname, num - ROW_NUMBER() OVER (PARTITION BY uname ORDER BY num) groupnum, num
FROM dbo.Test
) t
GROUP BY uname, groupnum
)
SELECT DISTINCT uname
, STUFF((
(
SELECT ', ' + NumRange
FROM cte as cte1
WHERE cte.uname = cte1.uname
ORDER BY cte1.MinNum
FOR XML PATH, TYPE
).value('.[1]','VARCHAR(255)')
), 1, 2, '') as NumRange
FROM cte;
The results:

STUFF
is used here to remove the leading ,
from the results. It does that by replacing the first two leading characters in the concatenated NumRange with a zero-length string ''
.