In theory:
If an object implements Close or Dispose, it does so because it holds an expensive, shared, native resource that should be released as soon as possible.
In real life:
I do agree with you that DataSet.Dispose does nothing and is just a side effect of inheritance.
As for me I never call Dispose on a DataSet.