(1) ReplaceAll
One simple workaround,
o = Association[{"ode" -> y'[x] == x, "ic" -> {}}];
Dataset[o] /. {} -> {""}

If one wishes to preserve Item formatting (if present)
Block[{Dataset},
Dataset[o, ItemSize -> 20, ItemStyle -> Red] /. {} -> {""}]

An identical result may be obtained by wrapping the Dataset in a (formatted) Dataset
Dataset[o] // Dataset[# /. {} -> {""}, ItemSize -> 20, ItemStyle -> Red] &
This workaround may be adapted to give a solution to the related question,
How to prevent Dataset from converting Pi to decimal point?
oo = Association[{"p1" -> 1/3, "p2" -> Pi}];
Dataset[oo] /. Pi -> "\[Pi]"

% // Dataset[#, ItemSize -> 10] &

A third related question is Why are empty lists not consistently formatted in a Dataset?
ds1 = Dataset[Association["a" -> {}, "b" -> {}, "c" -> {}]];
ds1x = ds1 /. {} -> {""};
Grid[{{ds1, ds1x}}, Spacings -> 3]

(2) HoldAll
Another approach it to wrap all values with HoldForm (or StandardForm)
x2 = Query[All, HoldForm][Dataset[o]];
x3 = Dataset[HoldForm /@ o, ItemSize -> 10];
Grid[{{Dataset[o], x2, x3}}, Spacings -> 1]

A problem with this workaround it that all values are wrapped with HoldForm, and this may not be always desirable.
(In the following example, note the inverted commas around the value for ic2)
ox = Association[{"ode" -> y'[x] == x, "ic" -> {}, "ic2" -> "Hello"}];
x1 = Dataset[ox];
x2 = Dataset[HoldForm /@ ox];
Grid[{{x1, x2}}, Spacings -> 3]

A better workaround may be the following:
modfn[x_] := x;
modfn[{}] := HoldForm[{}]
modfn[Pi] := HoldForm[Pi]
x1 = Query[{All -> modfn}][Dataset[ox]];
x2 = Dataset[modfn /@ ox, ItemSize -> 10];
Grid[{{Dataset[ox], x1, x2}}, Spacings -> 1]

And
Dataset[Query[{All -> modfn}][ds1], ItemSize -> 5]

(3) Observation
Block[{N}, ds = (Dataset[<|"a" -> Pi,
"b" -> {}, "c" -> 4, "d" -> E|>]); Print[ds]; ds]

Furthermore,
Block[{N}, ds = (Dataset[<|"a" -> Pi, "b" -> {},
"c" -> 4, "d" -> E, "f" -> 4.2|>]); Print[ds]; ds]
produces the following error in the Print[ds] output:
CompiledFunction::cfsa: Argument N[MachinePrecision] at
position 2 should be a machine-size real number.
This seems to suggest that Dataset compiles, and that compilation is somehow connected to the observed unusual and unexpected behaviour in all three related questions?
Defer@{}is maybe a better choice if you want to copy data from displayed dataset so that it does not containHoldForm. $\endgroup$Dataset[]on my system (MacOS ARM, V14.3.0). I tried double-clicking, but I can't select anything. Does it work for you? Or is there another way to copy the displayed data? $\endgroup$copy data to clipboardorcopy position to clipboard. $\endgroup$Dataset@Association[{"ode" -> y'[x] == x, "ic" :> {Nothing}}]-- you can't right-click copy the displayed{}(which is typeset in a different way thanDefer@{}, too). $\endgroup$Dataset[]displays is probably hard-coded. If there is a way, I've been barking up the wrong tree. $\endgroup$