For the splitting in a POSIX shell you could do:
set -f; IFS=-; set -- $1; IFS=' '
There - now all of your dashes are spaces and you can have the entire string in "$*" or else each space - previously dash - separated string in $1 $2 $3 ... (the total count of which is available to you in "$#") or you can get them as an expandable argument list in "$@".
Now, for the case conversion you can do:
IFS='
'; for c in $(printf %.1s "$@" | dd cbs=1 conv=unblock,ucase)
do set -- "$@" "$c${1#[!"$IFS"]}"; shift; done
Here's the whole thing by example:
set -f -- aaa-zzz-eee-rrr-foo-bar
set -f; IFS=-; set -- $1 $2;$1; IFS='
'; for c in $(printf %.1s "$@" | dd cbs=1 conv=unblock,ucase)
do set -- "$@" "$c${1#?}"
shift; done; printf %s\\n "$@"
which prints:
Aaa
Zzz
Eee
Rrr
Foo
Bar
...which isn't space-separated I know - I used "$@". It is space-separated in "$*" because I set $IFS's first byte to space - the delimiter is definable in that way. For example:
IFS=k; printf %s\\n "$*"; IFS=' '; printf %s\\n "$*"
...which prints...
AaakZzzkEeekRrrkFookBar
Aaa Zzz Eee Rrr Foo Bar
You can save it any time of course:
IFS=-; dashes="$*"; IFS=' '; spaces="$*"; IFS=; empty="$*"
printf %s\\n "$dashes" "$spaces" "$empty"
...which prints:
Aaa-Zzz-Eee-Rrr-Foo-Bar
Aaa Zzz Eee Rrr Foo Bar
AaaZzzEeeRrrFooBar
This is a more complex subject but it can be used to great effect in these areas. It is important to protect data integrity though - use set -f when splitting in the shell to avoid filename generation on [?* and quote expansions you don't intend to split.
The dd command above - as it should be noted - is likely only to be very effective in an ASCII locale. In others you should probably look to recode or iconv or similar.