You got the shift a bit wrong – a shift in time domain (which you want) is a multiplication with a sinusoid in frequency domain.
This is simply a consequence of the convolution theorem: you want to convolve with a dirac $\delta(t-\Delta t)$ in time, so you need to multiply with the dirac's Fourier Transform in frequency domain.
Thus, what you'd need is
DFT -> $\cdot e^{j2\pi \tilde{\Delta t} f}$ -> IDFT.
Yet, you incur other problems here:
- To do a DFT of your whole data, you'd need to first put your whole signal in a buffer. In reality, that means you can't do that to work with live signals.
- The DFT will lead to a cyclic temporal shift. I.e. the (fractional) samples that you "shift out" at the end will appear at the start of your output! That means you can't simply divide your signal into smaller DFT chunks and shift each one of them separately.
If you need to avoid that: Use the fast convolution; overlap-add and overlap-save are the two algorithms you should be looking at. It's what I did in a lot of places, when I needed multiple variable delays.
Generally, any (time-)symmetric linear filter has constant group delay – you don't even have to go through frequency domain if you don't like to.