For most build steps, it appears to be possible to set a default workdir for the whole build by ensuring that build.workdir is set. (E.g. you could subclass Build, override __init__() set self.workdir, and tell your BuildFactory about your Build subclass.)
However, FileUpload and FileDownload don't play nice with this scheme. From a quick read of BuildStep, it sounds like subclasses with a workdir are expected to implement setDefaultWorkdir(), and they do not. Thus, FileUpload and FileDownload steps do not respect the Build's workdir.