If you are ok with NULL values displayed as empty rows in both data rows and full rows, you can convert all non-row columns to rows and use COALESCE (or ISNULL), for example:
SELECT CASE WHEN GROUPING(Custodian) = 1 THEN 'Grand Total' WHEN GROUPING(PortfolioID) = 1 THEN Custodian+' '+'Total' ELSE Custodian END AS Custodian , COALESCE(PortfolioID,'') AS PortfolioID , COALESCE(PortfolioBaseCCY,'') AS PortfolioBaseCCY , COALESCE(CONVERT(char(10),[Date],101),'') AS [Date] , SUM(AmountTotalBaseEquiv) AS AmountTotalBaseEquiv , COALESCE(CONVERT(char(10),ExchangeRate),'') AS ExchangeRate , COALESCE(CONVERT(char(20),AmountTotalBaseEquivUSD),'') AS AmountTotalBaseEquivUSD , COALESCE(CONVERT(char(20),PortfolioNAVUSD),'') AS PortfolioNAVUSD , SUM(TotalCashPctNAV) AS TotalCashPctNAV FROM @ResultSet WHERE TotalCashPctNAV > 5 GROUP BY Custodian , PortfolioID , PortfolioBaseCCY , [Date] , AmountTotalBaseEquiv , ExchangeRate , AmountTotalBaseEquivUSD , PortfolioNAVUSD , TotalCashPctNAV WITH ROLLUP HAVING GROUPING_ID(Custodian , PortfolioID , PortfolioBaseCCY , [Date] , AmountTotalBaseEquiv , ExchangeRate , AmountTotalBaseEquivUSD , PortfolioNAVUSD , TotalCashPctNAV) IN (1,255,511) ORDER BY CASE WHEN GROUPING(Custodian) = 1 THEN 2 ELSE 1 END, Custodian, TotalCashPctNAV
Otherwise, you can use the case expression, as with Custodian, to determine which rows are totals. For instance:
CASE WHEN GROUPING(Custodian) + GROUPING(PortfolioId) > 0 THEN '' ELSE PortfolioID END AS PortfolioID