Well, I wanted to try to solve this as asked as an exercise for myself because I'm learning SQL in more depth. I think the problems with the given schema are well-enough documented for me to not say anything else about that.
For this code to work, the columns in the source data must be physical columns (i.e., not a table variable or columns in a view). You could abstract this code into functions and whatnot if there are more types than just bags and shoes. I just wanted to get the algorithmic stuff down. There are many other caveats for this to work properly, but as has been mentioned, denormalized data has a full set of caveats as well.
So here we go:
EDIT: Version 2. Thanks to Martin for helping with this. That is a really neat trick, although it's probably a rare thing to have to use.
I'm assuming the column names will match the search pattern (it's hard-coded enough, so why bother checking).
DECLARE @sql nvarchar(max)
SET @sql = 'SELECT Period, '
-- Build column sum for bags
DECLARE @bagsColumns nvarchar(max)
SELECT
@bagsColumns = COALESCE(@bagsColumns + '+', N'') + '[' + COLUMN_NAME + ']'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'SumTest' AND COLUMN_NAME LIKE '%bags%'
SET @sql = @sql + @bagsColumns + ' AS ''Sum of Bags'', '
-- Build column sum for shoes
DECLARE @shoesColumns nvarchar(max)
SELECT
@shoesColumns = COALESCE(@shoesColumns + '+', N'') + '[' + COLUMN_NAME + ']'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'SumTest' AND COLUMN_NAME LIKE '%shoes%'
SET @sql = @sql + @shoesColumns + ' AS ''Sum of Shoes'''
SET @sql = @sql + ' FROM SumTest'
EXEC(@sql)