Python3: <s>150</s> 146 bytes
f=lambda l:''.join('+-'[a<0]+str(a)[a<0:5*((abs(a)!=1)|(1>i))]+'x^'[:i]+str(i)[:i-1]for i,a in zip(range(len(l)-1,-1,-1),l)if a).lstrip('+')or '0'
(previous implementations):
f=lambda l: ''.join('+-'[a<0]+str(a)[a<0:5*((abs(a)!=1)|(1>i))]+'x^'[:i]+str(i)[:i-1] for i,a in zip(range(len(l)-1,-1,-1),l) if a).lstrip('+') or '0'
You can [*try it online*](https://tio.run/##hY/BboQgEIbv@xQ0PcAU2IDEbDTdvojRhG3XLQ1F43qgTd/dgibLag8lBGaY7/@Z6b/G984p/jrf09Qerf48vWlkS4z3H51xBFOOK/0sanodB6IhxmX@RIg@XUP6cJTwQ@SLAagp9g2uSrOgBkLIZd12AzJMI@PQt@nJoN3lTOzZEQtcsnkDs2BapGFvgzJAmGIIMizw1A/GjaQllWCiBtilfJ1FJzUjKL3ynEl2YLxYsVIELybjz38c0f16vEVit@njfyr2kyf2RnHfZFTlPrF3TW4dc98oGgUHz4vtBGIZYK0IpaDhMsGFkiyLw0q24AkOpfhBFs4s1D2V0y8)
Kudos to: @Benjamin