To the best of my knowledge, mud is your only non-dfhack option. Roads don't change it, removed floors don't change it, any other construction doesn't change it.
There are conditions under which certain tiles will choose random soil types when revealed..
One of them may be.. if you muddy stone, let vegetation grow on it, build a construction/pave over it, then remove the construction, apparently, possibly, when you remove the construction, a soil type may appear.
It may only work underground, though, as I've tried this on an above ground tile, and after two years, no ~grass will grow. Even using dfhack 'regrass' doesn't work, despite it being possible to farm on the tile. Growing crops on the Farm Plot tile(s), and then removing the farm still doesn't permit grass to grow, either, even though the mud remains. Building a floor on the previously farmed tile and then removing it simply removes the mud and exposes the stone again.
Setting just the subterranean flag also doesn't work, tried that with tiletypes. Same for inside & dark flags.. no change.
It might require breaching the caverns... doesn't seem so. Using 'feature show x' and revealing all the cavern layers isn't enough to grow moss, despite the tiletype settings/painting. After setting those features, dug out tiles underground instantly grow moss, but not those artificially modified previously above ground stone.
The difference may be the 'grow' vs 'no grow' flag when a tile is probe'd with dfhack. It seems that tiles flagged as grow will grow grass or moss. Those without it, will not.
It might be as easy as adding mud and setting the 'grow' flag, but I don't know of a dfhack utility that changes that specific flag.
It's specifically referred to in probe.cpp: block.occupancy[tileX][tileY].bits.no_grow , and is apparently contextually found in the "Occupancy" flags.
After setting the grow flag, it might be necessary to change the tiletypes, as well.
fix/tile-occupancy.lua changes some flags.. it might be possible to figure out how to refer to and/or set .bits.no_grow to 0 ?