This is a working solution:
SELECT x.*,
CASE
WHEN UserHasWatchedTVSeason.tvSeasonID IS NULL THEN 'No'
ELSE 'Yes'
END as watched
FROM
(SELECT
TVSeries.tvSeriesID, TVSeries.title,
TVSeriesHasTVSeason.tvSeasonID,
Users.userID
FROM TVSeries
LEFT JOIN TVSeriesHasTVSeason
on tvseries.tvSeriesID = TVSeriesHasTVSeason.tvSeriesID
LEFT JOIN TVSeason
on tvseason.tvSeasonID = TVSeriesHasTVSeason.tvSeriesID
CROSS JOIN Users)x
LEFT JOIN UserHasWatchedTVSeason
on x.tvSeasonID = UserHasWatchedTVSeason.tvSeasonID
AND x.userID = UserHasWatchedTVSeason.userID
My thought is that in my original post that I was losing my connection in the CROSS JOIN when I referenced it in later JOINS.
I would hope someone might be able to tell me WHY this worked exactly as it is still a little unclear to me.
Also to expand my answer to return 'yes', 'no', 'partially watched':
SELECT *
FROM
(SELECT userID, tvSeriesID,
CASE
WHEN COUNT(tvSeriesID) = ABS(SUM(watched))
AND SUM(watched) > 0 THEN 'Yes'
WHEN COUNT(tvSeriesID) = ABS(SUM(watched))
AND SUM(watched) < 0 THEN 'No'
ELSE 'Partial'
END as watched
FROM
(SELECT x.*,
CASE
WHEN UserHasWatchedTVSeason.tvSeasonID IS NULL THEN -1
ELSE 1
END as watched
FROM
(SELECT
TVSeries.tvSeriesID, TVSeries.title as tvSeriesTitle,
TVSeriesHasTVSeason.tvSeasonID,
Users.userID
FROM TVSeries
LEFT JOIN TVSeriesHasTVSeason
on tvseries.tvSeriesID = TVSeriesHasTVSeason.tvSeriesID
LEFT JOIN TVSeason
on tvseason.tvSeasonID = TVSeriesHasTVSeason.tvSeriesID
CROSS JOIN Users
)x
LEFT JOIN UserHasWatchedTVSeason
on x.tvSeasonID = UserHasWatchedTVSeason.tvSeasonID
AND x.userID = UserHasWatchedTVSeason.userID
)y
GROUP BY userID, tvSeriesID
)z
ORDER BY userID, tvSeriesID