Did you manage to solve this? Just looking at the code and was wondering what would happen if you used the base IPublishedContent case as a start and sourcePage.Value and tag.Value to find the properties by alias to see what happens? I am assuming that Tag is also an IPublishedContent (from a content picker?)
So maybe
var sourcePage = cache?.getById(content.id); // which will be IPublishedContent
then
var tags = sourcePage.Value<IEnumerable
>("tags");
then iterate each tag to get the Value of the alias "urlName".
maybe? Just wondering if something is happening with the castings