I don't know of any software specifically for creating solo dungeons. But I can give you some pointers that might help; even though I've not published any solos, I have written some. Maybe some of what I've learned from the experience can be of help to you.
For the following, you can use any text editor that has search and replace functionality.
1. Start numbering your paragraphs at 1001. Use the # symbol before paragraph numbers. Don't use the # symbol followed immediately by four or more numbers for anything else in your solo.
2. Don't worry about mixing up the paragraphs to begin with. The first paragraph you write is #1001. The second one is #1002. The third one is #1003. Etc. Just write them in an order that makes logical sense to you. You'll mix up the paragraphs later.
3. When you write a 'go to' instruction in a paragraph, put XXXX for the 'go to' paragraph number until you are ready to write the paragraph that the 'go to' leads to. Don't use XXXX for anything else in your solo.
4. When you write the paragraph that a 'go to' instruction leads to, find the paragraph that contains the corresponding 'go to' instruction and change the XXXX to the number of the paragraph that you just wrote. Include the # symbol before any paragraph number that you write.
5. When you write the paragraph that a 'go to' instruction leads to, write the number of the paragraph that contains the 'go to' instruction in square brackets after the paragraph; include the # symbol inside the brackets. This lets you keep track of which paragraphs lead to a particular paragraph.
Example of a work-in-progress paragraph:
#1023: You are at a three-way intersection. To head east, go to #1024. To take the west tunnel, go to #1012. If you want to walk north, go to XXXX. [#1014][#1015][#1027]
In the above example, paragraph #1023 is reachable so far from paragraphs #1014, #1015, and #1027. There is one 'go to' choice (going north) that does not yet have a paragraph written for it.
Now suppose we are ready to write the paragraph that the player reads when going north from paragraph #1023. Let's suppose the new paragraph is #1033, and that it looks something like this:
#1033: You come to a dead end, walk south from here by going to #1023. If you wish to search for secret doors, roll a level 2 SR on INT or LK. If you make it, turn to XXXX. Otherwise, it's time to head south. [#1023]
The [#1023] at the end of paragraph #1033 designates that one possible way to reach paragraph #1033 is from paragraph #1023.
We must make sure to update paragraph #1023 based on what we just wrote for paragraph #1033. Paragraph #1023 should be modified to now look like the following:
#1023: You are at a three-way intersection. To head east, go to #1024. To take the west tunnel, go to #1012. If you want to walk north, go to #1033. [#1014][#1015][#1027][#1033]
By following this practice, you can look at any paragraph and know not only where the paragraph leads, but also what paragraphs lead to it.
As you write paragraphs, you'll probably find yourself writing a certain path following a particular train of thought. When you reach a good stopping point on that path, you'll want to go back and pick up on unfinished paths. If you need help in finding the unfinished paths, you just search for XXXX in your text. Every XXXX in the adventure is an unfinished path.
When you have no unfinished paths remaining, you may wish to add WM, Magic Matrix, or Treasure charts to your adventure. If any of these refer to particular paragraphs in your text, be sure to use the same format for paragraph numbers.
After you finish writing all your paragraphs, play test your solo. If you need to make changes, they are most easily made at this point. It becomes more difficult to insert new paragraphs later.
During testing, it's good to print the adventure on paper. You can then cross off options that you take, so you will know that you've chosen that option before. When you finish the adventure, you can run through it again, choosing different options.
After lots of testing, look back through the adventure to see if all options have been crossed out. If not, you can use the bracketed numbers to figure out how to reach the untested paragraphs. For a given untested paragraph, just follow the bracketed numbers backwards through the adventure until you reach a paragraph that you previously reached during testing. You'll then know the path to take to reach the untested paragraph.
When you reach a paragraph during play testing, you might wish to cross off the bracketed number that corresponds to the paragraph that led you to this one. This way you can keep track of whether you've reached a particular paragraph from each possible lead-in paragraph.
After you've playtested and made all your changes, and you're completely happy with the adventure except for the layout, you're ready to mix up the paragraphs and do your layout. The first thing to do at this point is to make backup copies of your first draft document and store them in different places, not only on your computer's hard drive, but on CD or floppy disk or media card. You should also keep the printed copy of the adventure that you used for play testing. You want plenty of backups in various different media formats. Then if anything goes wrong in the following process, you can start over.
Next, create a new, empty document. Pick paragraphs from various different, non-sequential locations in your first draft, and start placing them in the new document. This will become the order of the paragraphs in the finished product, so mix them up well. But don't change any paragraph numbers yet. Make sure to move the entire paragraph into the new location; don't leave part of a paragraph stranded in the first draft.
You don't have to move the bracketed paragraph numbers to the new document, because those numbers are really only useful during play testing. They won't be in the final product.
You should lay out your paragraphs in such a way that no paragraph crosses a page boundary, so be mindful of page boundaries at this point. Moreover, if you want to add images to your adventure, you need to leave space for them wherever you want them to appear.
When you are satisfied with how the paragraphs are all mixed up and laid out, and you are sure you are not going to move any paragraphs, then you can use your search and replace function to start replacing the paragraph numbers you've used so far with the paragraph numbers as they are to be in the finished product, and to make them match the pages they are on.
I usually keep paragraph #1001 as the first paragraph of the adventure, which would make it paragraph number 1A, if you following the convention of some solos where the paragraph is labeled by a number and a letter, the number being the page number and the letter representing where the paragraph is located on the page. That is, 1A would be the first paragraph on page 1, while 1B would be the second paragraph on page 1, and 1C would be the third paragraph on page 1. Similarly, 2A would be the first paragraph on page 2, 2B would be the second paragraph on page 2, 2C would be the third paragraph on page 2, and so on.
If you follow that labeling convention, then to turn paragraph #1001 into paragraph 1A, you use your editor's search and replace function to replace all occurrences of #1001 with 1A.
You then walk through the new document, using search and replace to replace all occurrences of your old numbering scheme with the new labeling scheme.
For example, suppose the second paragraph on page 1 is our old friend, paragraph #1033. We would perform a search and replace function on that paragraph to replace #1033 with 1B. The paragraph might then look like this:
1B: You come to a dead end, walk south from here by going to #1023. If you wish to search for secret doors, roll a level 2 SR on INT or LK. If you make it, turn to #1074. Otherwise, it's time to head south.
Note that some of the paragraph numbers are at this point still in the old format. That's fine, we'll eventually get to them. But before we do, let's look at the paragraph that is currently numbered #1023:
#1023: You are at a three-way intersection. To head east, go to #1024. To take the west tunnel, go to #1012. If you want to walk north, go to 1B.
You notice in this paragraph that the occurrence of #1033 has been replaced with 1B.
Let's now suppose that, in our new layout:
Paragraph #1012 is the third paragraph on page 4.
Paragraph #1023 is the fifth paragraph on page 61.
Paragraph #1024 is the first paragraph on page 17.
Paragraph #1074 is the third paragraph on page 2.
That being the case, then our paragraphs that were originally numbered #1023 and #1033 will eventually look like the following, after all of our search and replace operations are finished:
Second paragraph on page 1:
1B: You come to a dead end, walk south from here by going to 61E. If you wish to search for secret doors, roll a level 2 SR on INT or LK. If you make it, turn to 2C. Otherwise, it's time to head south.
Fifth paragraph on page 61:
61E: You are at a three-way intersection. To head east, go to 17A. To take the west tunnel, go to 4C. If you want to walk north, go to 1B.
At this point, you can insert your images, and then you're ready to distribute your work!
Note: Some solos don't use the number-letter labels, but use strictly a one-up numbering scheme throughout the solo. For those solos, instead of replacing the first draft paragraph numbers with page-based labels, you can replace them with plain numbers. This is the main reason that I use 4-digit numbers in the first draft, so that when I search and replace, there aren't any conflicts between the first draft numbering scheme and the new numbering scheme. I also use the # symbol to help reduce the possibility of replacing a number that is not a paragraph number as though it were a paragraph number.
Well, that's my process for creating solos. It's not the same as what Boozer described in HH#7 as his process for creating solos and using Excel to track what paragraph numbers have been used, but maybe you can glean something from the above that is useful to you...