May not be what you're looking for, but I'd use Cygwin and the *nix find utility:
find dir1 -name "*.ext" | while read i; do zip "$i.zip" "$i"; done
"find" starts at "dir1" and recurses, matching everything with a name of the form "*.ext". It outputs a list of matches, which is piped to "while read i", which reads each line (a matching path) into the variable "i". For each different value of i, the "zip" command is executed, compressing the file into a zip archive of the same name (and path), but with ".zip" appended.
Note that the above will not remove the original file. I could have added "rm $i" after the zip command to do that, but it's better to create the archives in one step, and then use:
find dir1 -name "*.ext" | while read i; rm "$i"; done
to find and remove the originals. Another nice thing to do to test your line before running it is to echo the command, rather than executing it.
find dir1 -name "*.ext" | while read i; do echo zip "$i.zip" "$i"; echo rm "$i"; done
That will show you each of the zip and rm commands that it would do if you removed the echos, so you can make sure it's doing the right thing. Then remove the echos to actually do it.
If there's a nice way to do this with common Windows utilities, I'm not aware of it.