as you've probably guessed, because the brace expansion ({…,…}-> … …) happens before the parameter expansion ($LIST-> string stored within). From Bash manual, "3.2 Shell Expansions":
The order of expansions is: brace expansion; tilde expansion, parameter and variable expansion, arithmetic expansion, and command substitution (done in a left-to-right fashion); word splitting; filename expansion; and quote removal.
So, brace expansion happens first (by the way, that's different for zsh, where the order is history, alias, (process|parameter|command|arithmetic|brace), filename expansion, globbing).
In your example, I'd just go and temporarily set the string split character to , (I'd do that in a subshell to avoid contaminating the rest of my script):
IFS=,
ls $LIST # no brace expansion here!
But that won't help if you wanted to do something that needs brace expansion, such as LIST=a,b,c,d; ls $LIST/foo (you'd be getting ls a b c d/foo, which is not the same as ls a/foo b/foo c/foo d/foo).
A simple way out there is xargs or parallel.
LIST=000/487,000/488,000/489,000/490,000/491,000/492
echo $LIST | parallel -m -j1 -d ',' ls {}/foo
(the -m means "put as many arguments on one command line as possible within operating system limits for command lines", the -j1 means "only spawn 1 process, not one per processor core)
In zsh, you can get the brace-expansion behaviour with paramater expansions natively, using the (in my humble opininion) not trivial to remember form of ${(flags in parentheses)OPERATORvariablename}, in this case
LIST=000/487,000/488,000/489,000/490,000/491,000/492
ls ${(s:,:)^LIST}/foo
where the flags are sCHARdelimiterCHAR, "split at the string enclosed by CHAR", and the expansion operator is ^SPEC, which says "use the result of this expansion as a list in a brace expansion". (yes, it took a while to figure that out. I bet the zsh project would love clarifying documentation for man zshexpn.)
ls {000/487,000/488,000/489,000/490,000/491,000/492}is a bit strange, you'd usually wantls 000/{487,488,489,490,491,492}for that, or even more concise,ls 000/{487..492}000. As for usingeval, thanks it works but I don't really understand why. I very rarely useevalin shell scripts...