With good renaming along the way. Like so (which needs a little tidying for readability):
dat <- dat %>%
bind_cols(model.matrix(~ 0 + .$gleasoncat) %>% as_tibble() %>% select(-1)) %>%
rename_at(vars(starts_with(".$")), ~ str_replace(., ".\\$gleasoncat", "Gleason "))
Note also the dropping of the intercept column from model.matrix and the redundant baseline column (which would cause identifiability problems in models) via select(-1)