Why can't you define an explicit constructor? This is what they're for.
Moreover, why do you think you "can't afford heap allocation"? Heap allocation is very cheap in managed languages. How have you tested this assumption that you can't afford heap allocation, or indeed that heap allocation is more expensive in the first place?
(For a type consisting of "a double and several parameters", I suspect you're up in a size where heap allocation is actually cheaper and more efficient)
In any case, you can't prevent a user from calling the default constructor on a value type, if he so desires. All you can do is make sure that a better way to initialize the value exists, such as a non-default constructor, or if you can't create one for whatever reason, a function which creates and initializes your value type when called.
But of course, you have no guarantees that people actually call it.
Edit:
Heap allocation in .NET basically consists of just a simple stack push operation. That's the nice thing about managed (and garbage-collected) languages. The runtime essentially uses a big stack as its heap, so each allocation just increments the stack pointer a bit (after checking that there's enough free memory, of course).
The garbage collector then takes care of compacting the memory when necessary.
So the heap allocation itself is ridiculously cheap. Of course, the additional GC pressure might slow you down again (Although as far as I know, the time required for a GC pass depends only on the number of live object, not on the ones to be GC'ed, so having countless "dead" objects lying around may not be a big problem), but on the other hand, stack allocation isn't free either. Value types are passed by value, so every time you pass your type as a parameter to a function, or return it, a copy has to be made. I don't know how big your value is, but a double is 8 bytes, and given that you have a few extra parameters, I'll assume 32 bytes. That might be so big that the extra copying required for valuetypes makes it slower than if you'd used heap allocation. Perhaps.
As you can see, there are advantages to both value- and reference-types. I can't say which one is faster in your case, but if I were you, I'd be very careful making this kind of assumptions. If possible, structure your code so you can switch between a reference- and valuetype implementation, and see which works best. Alternatively, write smaller tests to try to predict how each would perform on a large scale.